package br.com.jk.cotacao.lancamento;

import br.com.jk.cotacao.Cotacao;
import br.com.jk.cotacao.itens.CotacaoItens;
import br.com.jk.produto.Produto;
import java.io.Serializable;
import java.util.Date;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.ForeignKey;

/**
 * @author camilo
 */
@Entity
@Table(name = CotacaoLancamentoDao.NAME_TABLE, schema = CotacaoLancamentoDao.NAME_SCHEMA)
public class CotacaoLancamento implements Serializable {

  public static final String ATTRIBUTE_ID = "id";
  public static final String ATTRIBUTE_QUANTIDADE = "quantidade";
  public static final String ATTRIBUTE_DATA_LANCAMENTO = "dataLancamento";
  public static final String ATTRIBUTE_SEQUENCIAL = "sequencial";
  public static final String ATTRIBUTE_COTACAOITENS = "cotacaoItens";
  public static final String ATTRIBUTE_COTACAO = "cotacao";
  public static final String ATTRIBUTE_PRODUTO = "produto";
  public static final String ATTRIBUTE_NUM_LANCAMENTO = "numLancamento";
  @Id
  @SequenceGenerator(name = CotacaoLancamentoDao.NAME_SEQUENCE, sequenceName = CotacaoLancamentoDao.NAME_SEQUENCE,
          schema = CotacaoLancamentoDao.NAME_SCHEMA)
  @GeneratedValue(strategy = GenerationType.AUTO, generator = CotacaoLancamentoDao.NAME_SEQUENCE)
  private int id;
  @Column(nullable = false, name = CotacaoLancamentoDao.NAME_COLUMN_QUANTIDADE)
  private int quantidade;
  @Temporal(TemporalType.DATE)
  @Column(name = CotacaoLancamentoDao.NAME_COLUMN_DATA_LANCAMENTO, nullable = false, updatable = false)
  private Date dataLancamento;
  @Column(name = CotacaoLancamentoDao.NAME_COLUMN_SEQUENCIAL)
  private int sequencial;
  @Column(name = CotacaoLancamentoDao.NAME_COLUMN_NUM_LANCAMENTO, nullable = false)
  private int numLancamento;
  @ManyToOne
  @JoinColumn(name = CotacaoLancamentoDao.NAME_COLUMN_ID_COTACAO, nullable = false)
  @ForeignKey(name = CotacaoLancamentoDao.NAME_FK_COTACAOLANCAMENTO_COTACAO)
  private Cotacao cotacao;
  @ManyToOne
  @JoinColumn(name = CotacaoLancamentoDao.NAME_COLUMN_ID_COTACAOITENS, nullable = false)
  @ForeignKey(name = CotacaoLancamentoDao.NAME_FK_COTACAOLANCAMENTO_COTACAOITENS)
  private CotacaoItens cotacaoItens;
  @ManyToOne
  @JoinColumn(name = CotacaoLancamentoDao.NAME_COLUMN_ID_PRODUTO, nullable = false)
  @ForeignKey(name = CotacaoLancamentoDao.NAME_FK_COTACAOLANCAMENTO_PRODUTO)
  private Produto produto;

  public int getNumLancamento() {
    return numLancamento;
  }

  public void setNumLancamento(int numLancamento) {
    this.numLancamento = numLancamento;
  }

  public Cotacao getCotacao() {
    return cotacao;
  }

  public void setCotacao(Cotacao cotacao) {
    this.cotacao = cotacao;
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public int getQuantidade() {
    return quantidade;
  }

  public void setQuantidade(int quantidade) {
    this.quantidade = quantidade;
  }

  public Date getDataLancamento() {
    return dataLancamento;
  }

  public void setDataLancamento(Date dataLancamento) {
    this.dataLancamento = dataLancamento;
  }

  public int getSequencial() {
    return sequencial;
  }

  public void setSequencial(int sequencial) {
    this.sequencial = sequencial;
  }

  public CotacaoItens getCotacaoItens() {
    return cotacaoItens;
  }

  public void setCotacaoItens(CotacaoItens cotacaoItens) {
    this.cotacaoItens = cotacaoItens;
  }

  public Produto getProduto() {
    return produto;
  }

  public void setProduto(Produto produto) {
    this.produto = produto;
  }

  @Override
  public int hashCode() {
    int hash = 5;
    hash = 79 * hash + this.id;
    hash = 79 * hash + this.quantidade;
    hash = 79 * hash + Objects.hashCode(this.dataLancamento);
    hash = 79 * hash + this.sequencial;
    hash = 79 * hash + this.numLancamento;
    hash = 79 * hash + Objects.hashCode(this.cotacao);
    hash = 79 * hash + Objects.hashCode(this.cotacaoItens);
    hash = 79 * hash + Objects.hashCode(this.produto);
    return hash;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    final CotacaoLancamento other = (CotacaoLancamento) obj;
    if (this.id != other.id) {
      return false;
    }
    if (this.quantidade != other.quantidade) {
      return false;
    }
    if (!Objects.equals(this.dataLancamento, other.dataLancamento)) {
      return false;
    }
    if (this.sequencial != other.sequencial) {
      return false;
    }
    if (this.numLancamento != other.numLancamento) {
      return false;
    }
    if (!Objects.equals(this.cotacao, other.cotacao)) {
      return false;
    }
    if (!Objects.equals(this.cotacaoItens, other.cotacaoItens)) {
      return false;
    }
    if (!Objects.equals(this.produto, other.produto)) {
      return false;
    }
    return true;
  }
}
